const VueSSRServerPlugin = require('vue-server-renderer/server-plugin')
const VueSSRClientPlugin = require('vue-server-renderer/client-plugin')
const nodeExternals = require("webpack-node-externals")
const merge = require("lodash.merge")
const IS_SERVER = process.env.WEBPACK_TARGET === 'node'
const target = IS_SERVER ? "server" : "client"

if (IS_SERVER) {
  module.exports = {
    configureWebpack: () => ({
      // 将 entry 指向应用程序的 server / client 文件
      entry: `./src/main-${target}.js`,
      // 对 bundle renderer 提供 source map 支持
      devtool: 'source-map',
      target: IS_SERVER ? "node" : "web",
      node: IS_SERVER ? undefined : false,
      output: {
        libraryTarget: IS_SERVER ? "commonjs2" : undefined
      },
      // https://webpack.js.org/configuration/externals/#function
      // https://github.com/liady/webpack-node-externals
      // 外置化应用程序依赖模块。可以使服务器构建速度更快，
      // 并生成较小的 bundle 文件。
      externals: nodeExternals({
        // 不要外置化 webpack 需要处理的依赖模块。
        // 你可以在这里添加更多的文件类型。例如，未处理 *.vue 原始文件，
        // 你还应该将修改 `global`（例如 polyfill）的依赖模块列入白名单
        whitelist: [/\.css$/]
      }),
      optimization: {
        splitChunks: {
          chunks: "async",
          minSize: 30000,
          minChunks: 2,
          maxAsyncRequests: 5,
          maxInitialRequests: 3
        }
      },
      plugins: [IS_SERVER ? new VueSSRServerPlugin() : new VueSSRClientPlugin()]
    }),
    chainWebpack: config => {
      config.module
        .rule("vue")
        .use("vue-loader")
        .tap(options => {
          merge(options, {
            optimizeSSR: false
          });
        });
    }
  }
} else {
  module.exports = {
    publicPath: process.env.NODE_ENV === 'production'
      ? '/'
      : '/',
    outputDir: 'dist',
    devServer: {
      proxy: {
        '^/api': {
          target: 'http://jh.localhost/',
          // ws: true,
          changeOrigin: true,
          pathRewrite: {
            // '^/api': ''
          }
        },
        '^/uploads': {
          target: 'http://jh.localhost/',
          // ws: true,
          changeOrigin: true,
          pathRewrite: {
            // '^/api': ''
          }
        }
      }
    },
    configureWebpack: {
      externals: {
        'vue': 'Vue',
        'vuex': 'Vuex',
        'vue-router': 'VueRouter',
        // 'element-ui': 'ELEMENT'
      }
    }
  }

}
